#include <iostream>

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/has_plus_assign.hpp>

template <class T>
typename boost::disable_if_c< boost::has_plus_assign<T>::value, T>::type 
process_data(const T& v1, const T& v2, const T& v3)
{
	std::cout << "generic version" << std::endl;
	return v1;
}

template <class T>
typename std::enable_if< boost::has_plus_assign<T>::value, T>::type
process_data(const T& v1, const T& v2, const T& v3)
{
	std::cout << "has_plus_assign version" << std::endl;
	return v1;
}

int main()
{
	int i = 1;
	std::cout << "==== 1 ====" << std::endl;
	process_data(i, i, i);

	std::cout << "==== 2 ====" << std::endl;
	process_data<const char*>("Testing", "example", "function");
	
	return 0;
}